home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Leser 15 / Amiga Plus Leser CD 15.iso / Tools / Development / PluginSRC_EvenMore / AmigaWriter2Text.e next >
Encoding:
Text File  |  2002-03-13  |  3.8 KB  |  178 lines

  1. /*
  2.    FinalWriter2Text
  3.    EvenMore FileIO plugin
  4.    Author: Chris Perver
  5.    Copyright (c) 2001
  6. */
  7.  
  8.  
  9. OPT REG=5
  10.  
  11. LIBRARY 'amigawriter2text.plugin',1,1,'AmigaWriter2Text 1.00' IS em_main, em_end, em_info, em_pluginid, em_begin, em_format
  12.  
  13. MODULE 'tools/ctype', '*epo'
  14.  
  15. DEF mem2, len2
  16.  
  17.  
  18. PROC em_isdatatype(memadr, lenadr)
  19.    DEF vers = FALSE
  20.    DEF w:PTR TO LONG
  21.  
  22.    -> Check for FORM header
  23.  
  24.    w := Long(memadr)
  25.    IF w = $00014559
  26.      w := Long(memadr + 4)
  27.      IF w = $57520002 THEN vers := TRUE
  28.    ENDIF
  29. ENDPROC vers
  30.  
  31.  
  32. PROC em_parsedata(memadr, lenadr)
  33.   DEF count = 0, count2 = 0
  34.   DEF wordwrap = 80, notdonewrapping = TRUE, currchar = 0
  35.   DEF notdone = TRUE
  36.   -> Allocate memory for file
  37. ->  IF (mem2 := New(lenadr + 1)) = NIL THEN RETURN -1
  38. ->  mem2[lenadr + 1] := "\n"                                                      -> Put safety LF at the end of mem
  39.   DEF w:PTR TO LONG, w2:PTR TO LONG, textcount = 0, slen = 0
  40. ->  DEF iswtxt = FALSE
  41.   DEF c, oldpos, oldcc
  42.   DEF eof
  43.  
  44.   mem2 := memadr
  45.  
  46.   -> FIND START OF TEXT
  47.   WHILE (textcount < 2) AND (count < lenadr)
  48.     WHILE memadr[count] <> "S" DO INC count
  49.     IF Long(memadr+count) = "STOP"
  50.       count := count + 4
  51.       IF Long(memadr + count) = "STOP"
  52.         count := count + 4
  53.         IF Long(memadr + count) = "NEXT"
  54.           count := count + 4
  55.           INC textcount
  56.         ENDIF
  57.       ENDIF
  58.     ENDIF
  59.     INC count
  60.   ENDWHILE
  61.   count := count + 4
  62.   WHILE (memadr[count] < $2e) AND (count < lenadr) DO INC count
  63.   DEC count
  64.  
  65.   -> FIND END OF TEXT
  66.   notdone := TRUE
  67.   eof := count
  68.   WHILE notdone AND (eof < lenadr)
  69.     SELECT 256 OF memadr[eof]
  70.       CASE $00
  71.         SELECT 256 OF memadr[eof+1]
  72.           CASE "S"
  73.             IF Long(memadr + eof+1) = "STOP" THEN notdone := FALSE
  74.           CASE "N"
  75.             IF Long(memadr + eof+1) = "NEXT" THEN notdone := FALSE
  76.         ENDSELECT
  77.         INC eof
  78.       DEFAULT
  79.         INC eof
  80.     ENDSELECT
  81.   ENDWHILE
  82.   notdone := TRUE
  83.  
  84.    WHILE notdone AND (count < eof)
  85.  
  86.      SELECT 256 OF memadr[count]
  87.        CASE $00
  88.          SELECT 256 OF memadr[count+1]
  89.            CASE $09
  90.              mem2[count2++] := "\n"
  91.              mem2[count2++] := "\n"
  92.              currchar := 0
  93.  
  94.              -> FINISH IF AT THE END OF THE DOC
  95.         ->     IF (memadr[count + 5] = $00) THEN notdone := FALSE
  96.            CASE $0b
  97.              mem2[count2++] := " "
  98.              INC currchar
  99.          ENDSELECT
  100.          count := count + 2
  101.  
  102.        DEFAULT
  103.          slen := memadr[count]
  104.          INC count
  105.          c := 0
  106.          WHILE (c < slen)
  107.            mem2[count2++] := memadr[count++]
  108.            INC currchar
  109.            INC c
  110.          ENDWHILE
  111.  
  112.          -> WORDWRAP
  113.          IF currchar >= wordwrap
  114.           -> Find last space
  115.           IF isspace(mem2[count2]) = TRUE
  116.             mem2[count2++] := "\n"
  117.             currchar := 0
  118.           ELSE
  119.             oldpos := count2
  120.             oldcc  := currchar
  121.             WHILE isspace(mem2[count2]) = FALSE
  122.               mem2[count2 + 1] := mem2[count2]
  123.               DEC count2
  124.               DEC currchar
  125.             ENDWHILE
  126.  
  127.             INC count2
  128.             mem2[count2] := "\n"
  129.             currchar := oldcc - currchar
  130.  
  131.             count2 := oldpos + 1
  132.          ENDIF
  133.        ENDIF
  134.  
  135.      ENDSELECT
  136.  
  137.    ENDWHILE
  138.  
  139.  
  140.   mem2[count2] := "\n"
  141.  
  142.  -> IF memadr
  143.  ->   Dispose(memadr); memadr := NIL
  144.  -> ENDIF
  145. ENDPROC mem2, count2
  146. -><
  147.  
  148. -> *** STANDARD PROCS FOR PLUGINS
  149.  
  150.  
  151. PROC em_main(epo:PTR TO em_pluginobj)
  152.   mem2, len2 := em_parsedata(epo.buffer, epo.length)
  153.   epo.buffer := mem2
  154.   epo.length := len2
  155.   RETURN TRUE
  156. ENDPROC
  157.  
  158. PROC em_begin(epo:PTR TO em_pluginobj)
  159.   DEF vers
  160.   vers := em_isdatatype(epo.buffer, epo.length)
  161.   IF vers
  162.     RETURN TRUE
  163.   ELSE
  164.     RETURN FALSE
  165.   ENDIF
  166.  
  167. ENDPROC
  168.  
  169. PROC em_end()      IS EMPTY
  170.  
  171. PROC em_info()     IS 'AmigaWriter2Text 1.00'
  172.  
  173. PROC em_pluginid() IS "FILE"
  174.  
  175. PROC em_format()   IS 'AmigaWriter'
  176.  
  177. PROC main()        IS EMPTY
  178.